/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package persistencia;

import Dominio.Controladora;
import Dominio.Empresa;
import Dominio.Usuario;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Agustin
 */
public class PersistenciaEmpresa {

    private static PersistenciaEmpresa instance;

    public static PersistenciaEmpresa getInstance() {
        if (instance == null) {
            instance = new PersistenciaEmpresa();
        }
        return instance;
    }

    public ResultSet ejecutarSeleccion(String query) throws SQLException {
        ResultSet rs;
        try {
            Conexion.getInstance().conectar();
            rs = Conexion.getInstance().select(query);
        } catch (Exception e) {
            throw new UnsupportedOperationException(e.toString());
        }
        return rs;
    }

    public Empresa recorerRS(ResultSet rs) throws SQLException, ParseException {
        Empresa emp = new Empresa();
        try {
            emp.setRut(Integer.parseInt(rs.getObject(1).toString()));
            emp.setRazon_social(rs.getObject(2).toString());
            emp.setNombre(rs.getObject(3).toString());
            emp.setDireccion(rs.getObject(4).toString());
            emp.setBarrio(rs.getObject(5).toString());
            emp.setTelefono(rs.getObject(7).toString());
        } catch (Exception e) {
            throw new UnsupportedOperationException(e.toString());
        }

        return emp;
    }

    public List<Empresa> traerRS(String query) throws ParseException, SQLException {
        List<Empresa> empresas = new ArrayList<Empresa>();
        try {
            ResultSet rs = ejecutarSeleccion(query);
            if (rs.next()) {
                empresas.add(recorerRS(rs));
                while (rs.next()) {
                    empresas.add(recorerRS(rs));
                }
            } else {
                Empresa e = new Empresa();
                empresas.add(e);
            }
        } catch (SQLException ex) {
            Logger.getLogger(PersistenciaUsuario.class.getName()).log(Level.SEVERE, null, ex);
        }
        Conexion.getInstance().desconectar();
        return empresas;
    }

    public List<Empresa> select(int rut) throws ParseException, SQLException {
        String query = "";
        if (rut == 0) {
            query = "select * from Empresas where activa=1 order by razon_social";
        } else {
            query = "select * from Empresas where activa=1 and rut=" + rut;
        }
        return traerRS(query);
    }

    public List<Empresa> selectInactivos(int rut) throws ParseException, SQLException {
        String query = "";
        if (rut == 0) {
            query = "select * from Empresas where activa=0";
        } else {
            query = "select * from Empresas where activa=0 and rut=" + rut;
        }
        return traerRS(query);
    }

    public List<Empresa> selectEmpresasPorEmpleado(String nobre_usuario) throws ParseException, SQLException {
        String query = "select Empresas.rut,razon_social,nombre,direccion,barrio,activa,telefono from Empresas inner join (select rut  from Usuarios_Empresas where id_empleado in (select id_empleado from Usuarios_Empresas  where nombre_usuario='" + nobre_usuario + "' and fecha_egreso is null) ) as t2 on Empresas.rut=t2.rut";
        return traerRS(query);
    }

    public int insert(int rut, String razon_social, String nombre, String direccion, String barrio, String telefono) throws ParseException {
        int resultado = 0;
        try {
            Empresa e = new Empresa();
            e = selectInactivos(rut).get(0);
            String query = "";
            if (e.getRut() != 0) {
                if (e.getRazon_social().equals(razon_social)) {
                    query = "update Empresas set  activa=true where rut=" + rut + "";
                    Conexion.getInstance().conectar();
                    Conexion.getInstance().insert(query);
                    resultado = 2;
                } else {
                    resultado = 1;
                }
            } else {
                query = "insert into Empresas (rut,razon_social,nombre,direccion,barrio,activa,telefono) values(" + rut + ",'" + razon_social + "','" + nombre + "','" + direccion + "','" + barrio + "'," + true + ",'" + telefono + "')";
                Conexion.getInstance().conectar();
                Conexion.getInstance().insert(query);
            }
        } catch (SQLException ex) {
            Logger.getLogger(PersistenciaUsuario.class.getName()).log(Level.SEVERE, null, ex);
        }
        return resultado;
    }

    public int insertEmpleados(int rut, String nombre_usuario) throws ParseException, SQLException {
        int resultado = 0;
        try {

            List<Usuario> usuarios = Controladora.getInstance().selectEmpleados(rut + "", 1 + "");
            int x = 0;
            for (Usuario u : usuarios) {
                if (u.getNombre_usuario().equals(nombre_usuario)) {
                    resultado = 1;
                } else {
                    resultado = 0;
                }
            }
            List<Empresa> empresas = selectEmpresasPorEmpleado(nombre_usuario);
            for (Empresa e : empresas) {
                if (e.getRut() == rut) {
                    x = 1;
                }
            }
            if (x == 0) {
                SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy");
                Date fecha = new Date();
                String query = "insert into Usuarios_Empresas (rut,nombre_usuario,fecha_ingreso) values(" + rut + ",'" + nombre_usuario + "'," + df.format(fecha) + ")";
                Conexion.getInstance().conectar();
                Conexion.getInstance().insert(query);
            } else {
                resultado = 1;
            }
        } catch (SQLException ex) {
            Logger.getLogger(PersistenciaUsuario.class.getName()).log(Level.SEVERE, null, ex);
        }

        return resultado;
    }

    public int calificarEmpleados(int rut, String nombre_usuario, int valor, String comentario) throws ParseException {
        int resultado = 0;
        try {
            List<Empresa> empresas = selectEmpresasPorEmpleado(nombre_usuario);
            List<Usuario> usuarios = Controladora.getInstance().selectEmpleados(rut + "", 1 + "");
            int x = 1;
            for (Usuario u : usuarios) {
                if (u.getNombre_usuario().equals(nombre_usuario)) {
                    resultado = 0;
                } else {
                    resultado = 1;
                }
            }
            for (Empresa e : empresas) {
                if (e.getRut() == rut) {
                    x = 0;
                }
            }
            if (x == 0) {
                SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy");
                Date fecha = new Date();
                Conexion.getInstance().desconectar();
                Conexion.getInstance().conectar();
                ResultSet r = Conexion.getInstance().select("select * from usuarios_empresas where rut=" + rut + " and nombre_usuario='" + nombre_usuario + "'");
                int s = 0;
                while (r.next()) {
                    s = r.getInt(1);
                }
                String query = "insert into Calificaciones (id_empleado,comentario,valor,fecha) values(" + s + ",'" + comentario + "'," + valor + ",#" + df.format(fecha) + "#)";
                Conexion.getInstance().desconectar();
                Conexion.getInstance().conectar();
                Conexion.getInstance().insert(query);
            } else {
                resultado = 1;
            }
        } catch (SQLException ex) {
            Logger.getLogger(PersistenciaUsuario.class.getName()).log(Level.SEVERE, null, ex);
        }
        return resultado;
    }

    public void update(int rut, String razon_social, String nombre, String direccion, String barrio, String telefono) {
        try {
            String query = "update Empresas set razon_social='" + razon_social + "', nombre='" + nombre + "',direccion='" + direccion + "',barrio='" + barrio + "',telefono='" + telefono + "' where rut=" + rut;
            Conexion.getInstance().conectar();
            Conexion.getInstance().insert(query);
        } catch (SQLException ex) {
            Logger.getLogger(PersistenciaUsuario.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void baja(int rut) {
        try {
            SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy");
            Date fecha = new Date();
            String query = "update Empresas set  activa=false  where rut=" + rut + "";
            String query2 = "update usuarios_empresas set fecha_egreso=#" + df.format(fecha) + "# where rut=" + rut + " and fecha_egreso is null";
            Conexion.getInstance().conectar();
            Conexion.getInstance().insert(query);
            Conexion.getInstance().insert(query2);
        } catch (SQLException ex) {
            Logger.getLogger(PersistenciaUsuario.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
